package test2;

import java.util.Scanner;

public class Solution2 {
    static int count = 1;
    static int[][] table;

    public static void main(String[] args) {
        System.out.println("请输入n（棋盘边长为2^n）：");
        Scanner sc = new Scanner(System.in);
        int siz = sc.nextInt();
        int size = (int) Math.pow(2,siz);
        table = new int[size][size];
        System.out.println("请输入缺块的位置：");
        int x = sc.nextInt();
        int y = sc.nextInt();
        Tromino(x, y, 0, 0, size);

        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                System.out.print(table[i][j] + "\t");
            }
            System.out.println();
        }
    }

    /**
     * @param x 缺块的x轴坐标
     * @param y 缺块的y轴坐标
     * @param tabX 子区域左下角的下标
     * @param tabY 子区域左下角的下标
     * @param size 子区域的大小
     */
    private static void Tromino(int x, int y, int tabX, int tabY,int size){
        if (size == 1){
            return;
        }
        int num = count++;
        int s = size / 2;
        //缺块在左上角
        if (x < tabX + s && y >= tabY + s){
            Tromino(x, y, tabX, tabY + s, s);
        }else {//如果没有在则放置瓦片
            table[tabX + s - 1][tabY + s] = num;
            Tromino(tabX + s - 1, tabY +s, tabX, tabY + s, s);
        }
        //缺块在右上角
        if (x >= tabX + s && y >= tabY + s){
            Tromino(x, y, tabX + s, tabY + s, s);
        }else {
            table[tabX + s][tabY + s] = num;
            Tromino(tabX + s, tabY + s, tabX + s, tabY + s, s);
        }
        //缺块在左下角
        if (x < tabX + s && y < tabY + s){
            Tromino(x, y, tabX, tabY, s);
        }else {
            table[tabX + s - 1][tabY + s - 1] = num;
            Tromino(tabX + s - 1, tabY +s - 1, tabX, tabY, s);
        }
        //缺块在右下角
        if (x >= tabX + s && y < tabY + s){
            Tromino(x, y, tabX + s, tabY, s);
        }else {
            table[tabX + s][tabY + s - 1] = num;
            Tromino(tabX + s, tabY + s, tabX + s, tabY, s);
        }
    }
}